#include <wwdg.h>

// 保存WWDG计数器的设置值,默认最大
u8 WWDG_CNT = 0x7f;

/* 函数作用：初始化窗口看门狗 (WWDG)
 * 参数说明：
 * Counter：计数器初值
 * WindowValue：窗口值
 * WWDG_Prescaler：预分频系数
 *     @arg WWDG_Prescaler_1: WWDG counter clock = (PCLK1/4096)/1
 *     @arg WWDG_Prescaler_2: WWDG counter clock = (PCLK1/4096)/2
 *     @arg WWDG_Prescaler_4: WWDG counter clock = (PCLK1/4096)/4
 *     @arg WWDG_Prescaler_8: WWDG counter clock = (PCLK1/4096)/8
 * 返回值：void
 */
void wwdg_init(u8 Counter, u8 WindowValue, u32 WWDG_Prescaler)
{
    NVIC_InitTypeDef NVIC_InitStrue;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); // 使能 WWDG 时钟

    WWDG_SetPrescaler(WWDG_Prescaler); // 设置预分频系数
    WWDG_SetWindowValue(WindowValue);  // 设置窗口值

    WWDG_CNT = Counter & WWDG_CNT; // 计算初值（低7位有效）
    WWDG_Enable(WWDG_CNT);         //使能看门狗，设置 counter (初值)

    WWDG_ClearFlag(); // 清除提前唤醒中断标志位

    NVIC_InitStrue.NVIC_IRQChannel                   = WWDG_IRQn; // 中断类型（WWDG）
    NVIC_InitStrue.NVIC_IRQChannelCmd                = ENABLE;    // 使能
    NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority = 0;         // 抢占优先级
    NVIC_InitStrue.NVIC_IRQChannelSubPriority        = 0;         // 响应优先级

    NVIC_Init(&NVIC_InitStrue); // NVIC初始化
    WWDG_EnableIT();            // 开启窗口看门狗中断
}

/* 函数作用：WWDG 中断服务函数
 * 参数说明：void
 * 返回值：void
 */
void WWDG_IRQHandler(void)
{
    WWDG_SetCounter(WWDG_CNT); // 设置初值，喂狗
    WWDG_ClearFlag();          // 清除提前唤醒中断标志位（必要）
}
